class Solution {
public:
    int translateNum(int num) {
        if(num < 0)  return 0;
        /*
        (202012/14自)采用递归实现动态规划:从num尾部到头部判断有多少种结合方式；
		定义函数f(i)表示从第i位数字开始不同翻译的数目，那么f(i) = f(i + 1) + g(i, i + 1)*f(i + 2);
		当第i位和第i + 1位两位数字拼接起来的数字在10~25的范围内时，函数g(i, i+1)的值为1，否则为0;
        */
        int times = 0;//记录方法总数
        countTimes(num, times);

        return times;
    }

    void countTimes(int num, int &times){
        if(num < 10 || (num > 25 && num < 100))
        {
            ++times;
            return;
        }
        else if(num >= 10 && num <= 25)
        {
            times += 2;//12,23等一共有两种组合方法
            return;
        }

        //num >= 100
        countTimes(num / 10, times);
        if(num % 100 <= 25 && num % 100 >= 10 ) countTimes(num / 100, times);

        return;
    }
};